/**
 * 将格林威治时间转换为上海时间（UTC+8）
 * @param {Date|string} date - 格林威治时间，可以是Date对象或字符串
 * @returns {Date} 上海时间的Date对象
 */
function convertToShanghaiTime(date) {
  if (!date) return null;
  
  let utcDate;
  
  // 如果输入是字符串，需要处理特殊格式
  if (typeof date === 'string') {
    // 处理 "2021-01-06 00:00:00.0" 这种格式
    const normalizedDateStr = date.replace(' ', 'T').replace(/\.\d+$/, '');
    utcDate = new Date(normalizedDateStr);
    
    // 如果还是无效日期，尝试其他格式
    if (isNaN(utcDate.getTime())) {
      utcDate = new Date(date);
    }
  } else {
    utcDate = new Date(date);
  }
  
  // 验证日期是否有效
  if (isNaN(utcDate.getTime())) {
    console.warn('无效的日期格式:', date);
    return null;
  }
  
  // 加上8小时的毫秒数转换为上海时间
  const shanghaiTime = new Date(utcDate.getTime() + (8 * 60 * 60 * 1000));
  
  return shanghaiTime;
}

/**
 * 将格林威治时间转换为上海时间的格式化字符串
 * @param {Date|string} date - 格林威治时间
 * @param {string} format - 时间格式，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的上海时间字符串
 */
function formatShanghaiTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
  const shanghaiDate = convertToShanghaiTime(date);
  
  if (!shanghaiDate) {
    return '-';
  }
  
  const year = shanghaiDate.getFullYear();
  const month = String(shanghaiDate.getMonth() + 1).padStart(2, '0');
  const day = String(shanghaiDate.getDate()).padStart(2, '0');
  const hours = String(shanghaiDate.getHours()).padStart(2, '0');
  const minutes = String(shanghaiDate.getMinutes()).padStart(2, '0');
  const seconds = String(shanghaiDate.getSeconds()).padStart(2, '0');
  
  return format
    .replace('YYYY', year)
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds);
}

/**
 * 获取当前上海时间
 * @returns {Date} 当前上海时间的Date对象
 */
function getCurrentShanghaiTime() {
  return convertToShanghaiTime(new Date());
}

export {
  convertToShanghaiTime,
  formatShanghaiTime,
  getCurrentShanghaiTime
};